package cn.ike.utils;


import lombok.extern.log4j.Log4j;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Jedis连接池的工具类
 */
@Log4j
public class JedisUtils {
    private static String ADDR = "localhost";
    private static int PORT = 6379;

    //可用连接实例的最大数目，默认值为8；
    //如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。
    private static int MAX_ACTIVE = 100;

    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例，默认值也是8。
    private static int MAX_IDLE = 10;

    //等待可用连接的最大时间，单位毫秒，默认值为-1，表示永不超时。如果超过等待时间，则直接抛出JedisConnectionException；
    private static int MAX_WAIT = 1000;

    private static int TIMEOUT = 10000;

    //在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
    private static boolean TEST_ON_BORROW = true;

    private static JedisPool jedisPool = null;

    //获取链接
    public static synchronized Jedis getJedis(){
        if(jedisPool==null){
            log.info("jedisPool==null , to reGet ");
            try {
                JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
                //指定连接池中最大空闲连接数
                jedisPoolConfig.setMaxIdle(MAX_IDLE);
                //链接池中创建的最大连接数
                jedisPoolConfig.setMaxTotal(MAX_ACTIVE);
                //设置创建链接的超时时间
                jedisPoolConfig.setMaxWaitMillis(MAX_WAIT);
                //表示连接池在创建链接的时候会先测试一下链接是否可用，这样可以保证连接池中的链接都可用的。
                jedisPoolConfig.setTestOnBorrow(true);
                jedisPool = new JedisPool(jedisPoolConfig,ADDR, PORT, TIMEOUT);

            } catch (Exception e) {
                log.error("jedisPool get error "+e.toString());
            }
        }
        return jedisPool.getResource();
    }
}